package com.biz.ssm.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Date;

public class JwtUtils {

    public static String Authorization = "Authorization";
    public static String SECRET = "7AWd50kbG8NblOBZGuUBBLYhqXltGn4K";
    public static String IIS = "sinosoft";




    /**
     * 由字符串生成加密key
     *
     * @return
     */
    public static SecretKey generalKey(String secret) {
        byte[] encodedKey = Base64.decodeBase64(secret);
        SecretKeySpec key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
        return key;
    }

    /**
     * 创建jwt
     *
     * @param secret
     * @param issuer
     * @param subject
     * @param ttlMin
     * @return
     * @throws Exception
     */
    public static String createToken(String secret, String issuer, String subject, long ttlMin) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS512;
        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);
        SecretKey key = generalKey(secret);
        // 下面就是在为payload添加各种标准声明和私有声明了
        JwtBuilder builder = Jwts.builder() // 这里其实就是new一个JwtBuilder，设置jwt的body
                .setIssuedAt(now)           // iat: jwt的签发时间
                .setIssuer(issuer)          // issuer：jwt签发人
                .setSubject(subject)        // sub(Subject)：代表这个JWT的主体，即它的所有人，这个是一个json格式的字符串，可以存放什么userid，roldid之类的，作为什么用户的唯一标志。
                .setExpiration(new Date(nowMillis + ttlMin * 1000 * 60))
                .signWith(signatureAlgorithm, key); // 设置签名使用的签名算法和签名使用的秘钥
        return builder.compact();
    }

    /**
     * 从token中获取内容
     *
     * @param token
     * @return
     */
    public static String getSubject(String token, String secret) {
        return getTokenBody(token, secret).getSubject();
    }

    /**
     * 判断是否已过期
     *
     * @param token
     * @return
     */
    public static boolean isExpiration(String token, String secret) {
        return getTokenBody(token, secret).getExpiration().before(new Date());
    }


    private static Claims getTokenBody(String token, String secret) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token)
                .getBody();
    }
}
